package com.yami.shop.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yami.shop.bean.dto.BlockchainShopDTO;
import com.yami.shop.bean.dto.BrandShopDTO;
import com.yami.shop.bean.model.Blockchain;
import com.yami.shop.bean.model.BlockchainShop;
import com.yami.shop.bean.vo.BlockchainShopVO;
import com.yami.shop.bean.vo.BrandShopVO;
import com.yami.shop.bean.vo.BrandSigningVO;
import com.yami.shop.common.util.PageParam;

import java.util.List;

/**
 * @Author lth
 * @Date 2021/7/28 10:25
 */
public interface BlockchainShopService extends IService<BlockchainShop> {

    /**
     * 签约链平台
     *
     * @param blockchainShopList 签约的链平台信息列表
     * @param shopId             签约的店铺id
     * @param isPlatform         是否是平台端操作
     */
    void signingBlockchain(List<BlockchainShop> blockchainShopList, Long shopId, Boolean isPlatform);

    /**
     * 根据店铺id批量保存链平台签约信息
     *
     * @param blockchainShopList
     * @param shopId
     * @param status
     * @return
     */
    void insertBatchByShopId(List<BlockchainShop> blockchainShopList, Long shopId, Integer status);

    /**
     * 根据店铺id获取签约的链平台列表和链平台语言信息(链平台和语言列表，如果只需要链平台名称，建议使用 listSigningBlockchainAndLang） 【缓存】
     *
     * @param shopId
     * @return
     */
    List<BlockchainShopVO> listSigningBlockchainAndLang(Long shopId);

    /**
     * 根据店铺id获取签约的链平台列表(返回所有）
     *
     * @param shopId
     * @return
     */
    List<BlockchainShopVO> listSigningBlockchainByShopId(Long shopId);

    /**
     * 获取店铺签约的可用链平台列表和链平台语言信息(发布商品时使用,链平台信息和语言列表，如果子需要链平台名称，建议用 listAvailableSigningBlockchainLang）
     *
     * @param shopId
     * @return
     */
    List<BlockchainShopVO> listAvailableSigningBlockchainLang(Long shopId);

    /**
     * 获取店铺签约的可用链平台列表(发布商品时使用）
     *
     * @param shopId
     * @return
     */
    List<BlockchainShopVO> listAvailableSigningBlockchain(Long shopId);

    /**
     * 根据店铺id、链平台id获取折扣率
     *
     * @param shopId 店铺id
     * @param blockchainId 链平台id
     * @return 平台佣金
     */
    List<BlockchainShop> listRateByShopId(Long shopId,Long blockchainId);

    /**
     * 根据链平台id删除店铺链平台关联关系
     *
     * @param blockchainId
     */
    void deleteByBlockchainId(Long blockchainId);

    /**
     * 根据存在变化的链平台的id列表清除缓存
     *
     * @param blockchainIds
     */
    void removeCacheByChangeBlockchainIds(List<Long> blockchainIds);

    /**
     * 根据店铺id与状态更改签约状态
     *
     * @param shopId
     * @param oldStatus
     * @param newStatus
     */
    void changeStatusByShopIdAndStatus(Long shopId, Integer oldStatus, Integer newStatus);

    /**
     * 根据店铺ids清除缓存
     *
     * @param shopIds
     */
    void removeCacheByShopIds(List<Long> shopIds);

    /**
     * 分页获取链平台签约信息
     *
     * @param page
     * @param BlockchainShop
     * @return
     */
    IPage<BlockchainShopVO> pageSigningInfo(PageParam<BlockchainShopVO> page, BlockchainShopDTO BlockchainShop);

    /**
     * 根据店铺id与链平台id删除签约链平台
     *
     * @param shopId
     * @param blockchainId
     */
    void delete(Long shopId, Long blockchainId);

    /**
     * 根据店铺id与平台id更新折扣率
     *
     * @param shopId
     * @param blockchainId
     * @param discount
     */
    void updateDiscount(Long shopId, Long blockchainId, Double discount);

    /**
     * 根据店铺id获取链平台签约信息
     * @param shopId 店铺ID
     * @param status
     * @return 链平台签约信息列表
     */
    List<BlockchainShopVO> listSigningByShopId(Long shopId, Integer status);

    /**
     * 根据店铺id分页签约的链平台列表
     * @param page
     * @param blockchainShopDTO
     * @return
     */
    IPage<BlockchainShopVO> pageSigningByShopId(PageParam<BlockchainShopVO> page, BlockchainShopDTO blockchainShopDTO);

    /**
     *  根据店铺id查询未申请铸币权限链
     *
     * @param shopId
     * @param applyId  申请id,不为空时排除该id
     * @return
     */
    List<BlockchainShopVO> listByIsCoin(Long shopId, Long applyId);

    /**
     *  根据链id更新商品同步标志
     *
     * @param blockchainShopId
     * @param isSynchronization
     */
    void updateSynchronizationStatus(Long blockchainShopId, Integer isSynchronization);
}
